package com.example.month11.vp_tab;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.example.month11.flowlayout.view.TagAdapter;
import com.example.month11.vp_tab.fragment.TabFragment;
import com.example.recyclerview01.R;
import com.example.utils.L;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 微信主界面实现效果(ViewPager+Fragment)。Tab切换时，底部tab有动画效果。
 * 屏幕旋转界面恢复
 * 主界面有那些常见的实现方式。
 * ViewPager+FragmentPagerAdapter
 * ViewPager+FragmentStatePagerAdapter
 * Activity与Fragment通信的正确写法。
 * Fragment与Activity通信的正确写法。
 * 页面多Tab，fragments集合的管理。
 */
public class WeChatHomeActivity extends AppCompatActivity {
    private ViewPager mVpMain;
    private List<String> mTitles = new ArrayList<>(Arrays.asList("微信", "通讯录", "发现", "我的"));

    private Button mBtnWechat;
    private Button mBtnFriend;
    private Button mBtnFind;
    private Button mBtnMine;
    private List<Button> mTabs = new ArrayList<>();

    // 合理管理Fragment 的方式。
    private SparseArray<Fragment> mFragments = new SparseArray<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_we_chat_home);
        setTitle("微信主界面实现效果");

        initViewPagerAdapter();
        initButtons();
    }

    private void initButtons() {
        mBtnWechat = findViewById(R.id.btn_wechat);
        mBtnFriend = findViewById(R.id.btn_friend);
        mBtnFind = findViewById(R.id.btn_find);
        mBtnMine = findViewById(R.id.btn_mine);
        mTabs.add(mBtnWechat);
        mTabs.add(mBtnFriend);
        mTabs.add(mBtnFind);
        mTabs.add(mBtnMine);

        mBtnWechat.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取第一个fragment
                TabFragment tabFragment = (TabFragment) mFragments.get(0);
                if (tabFragment != null) {
                    tabFragment.changeTitle("获取第一个fragment");
                }
            }
        });
    }

    private void initViewPagerAdapter() {
        mVpMain = findViewById(R.id.vp_main);
        mVpMain.setOffscreenPageLimit(mTitles.size()); // 设置缓存数量。（2n+1）
        mVpMain.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @NonNull
            @Override
            public Fragment getItem(int position) {
                // 相当于CreateFragment
                TabFragment tabFragment = TabFragment.newInstance(mTitles.get(position));
                if (position == 0) {
                    // 监听第一个tab，需要监听，就监听；也可以选择不监听。
                    tabFragment.setOnTitleClickListener(new TabFragment.OnTitleClickListener() {
                        @Override
                        public void click(String title) {
                            changeWeChatTab(title);
                        }
                    });
                }
                return tabFragment;
            }

            @Override
            public int getCount() {
                return mTitles.size();
            }

            @NonNull
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                TabFragment tabFragment = (TabFragment) super.instantiateItem(container, position);
                mFragments.put(position, tabFragment); // 添加到集合中
                return tabFragment;
            }

            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
                // 从集合中移除。保证界面中有几个Fragment，mFragments就有几个。而且是一一对应的。
                mFragments.remove(position);
                super.destroyItem(container, position, object);
            }
        });

        // 监听页面滚动
        mVpMain.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                L.d("onPageScrolled: pos" + position + ",positionOffset" + positionOffset + ",OffsetPixels" + positionOffsetPixels);
                // 从左到右滑动0->1: left pos, right pos+1; positionOffset:0~1
                // leftProgress:1~0（1-positionOffset）; rightProgress:0~1（positionOffset）.
                // 从右到左滑动1->0: left pos, right pos+1; positionOffset:1~0
                // leftProgress:0~1（1-positionOffset）; rightProgress:1~0（positionOffset）.

                // 获取btn，给btn设置progress。
                if (positionOffset > 0) { // 处理异常。
                    Button left = mTabs.get(position);
                    Button right = mTabs.get(position + 1);
                    left.setText((1 - positionOffset) + "");
                    right.setText(positionOffset + "");
                }
            }

            @Override
            public void onPageSelected(int position) {
                L.d("onPageSelected: " + position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    public void changeWeChatTab(String title) {
        mBtnWechat.setText(title);
    }

}